[LeetCode-周赛]286
Rank : 111/21134
Solved : 4/4
Find the Difference of Two Arrays
思路
模拟题意即可. 使用哈希表unordered_set
可以快速判断某个数是否存在.
Code
1 | class Solution { |
复杂度分析
- 时间复杂度$O(N)$
- 空间复杂度$O(N)$
Minimum Deletions to Make Array Beautiful
思路
贪心. 假设左边已经保留了left
个数字, 当前枚举到i
位置. 我们从i
位置开始往右找j
, 直到nums[j] == nums[i]
不满足为止(双指针算法). 这样我们找到了一段与nums[i]
相等的子数组. 现在我们判断:
- 如果
left
为奇数: 说明i
是答案中的奇数下标, 因此我们可以最多保留2个nums[i]. 它两的位置是先奇数再偶数, 这样满足题意. - 如果
left
为偶数: 说明i
是答案中的偶数下标, 因此我们只能保留1个nums[i].
贪心选择完成后, 我们最后检查保留数组的长度是否为奇数, 如果为奇数, 去掉最后一个即可.
Code
1 | class Solution { |
复杂度分析
- 时间复杂度$O(N)$
- 空间复杂度$O(1)$
Find Palindrome With Fixed Length
思路
模拟题意. 题目限定了回文数字的长度为intLength
, 这样我们可以自由指定的长度为 $len = \lceil intLength / 2 \rceil$. 除了首位必须大于0之外, 我们可以任意的指定其他位置数字, 并且由于回文数字的长度相等且比较数字的时候先比较高位, 因此高位的排序就是最后回文数字的排序.
我们记录 $L = pow(10, len - 1), R = pow(10, len) - 1$. 如果我们要求第k
个回文数字, 那么它的高位一定是L + k - 1
, 然后我们根据长度是奇数还是偶数将高位和低位拼接在一起即可.
还需要检查 $L + k - 1 <= R$ 是否满足, 若不满足则不存在这样的第k
个回文数字, 答案为-1.
Code
1 | using LL = long long; |
复杂度分析
- 时间复杂度$O(N)$
- 空间复杂度$O(1)$: 常数空间存储数字, 也可以认为是$log_{10}{max(queries)}$
Maximum Value of K Coins From Piles
思路
经典二维动态规划.
状态定义:
$f[i][j]$表示考虑了前i
个硬币桌子, 且总共拿了j
个时取得的最大价值状态转移:
- $f[i][j] = f[i - 1][j]$: 表示第
i
个桌子一个也不拿. - $f[i][j] = max(f[i][j], f[i - 1][j - u] + sum), u\in{[1, min(j, m)]}$: 表示第
i
个桌子上拿取前u
个(其价值为sum
), 且第i
个桌子最多有m
个.
- $f[i][j] = f[i - 1][j]$: 表示第
Code
1 | const int N = 1010, M = 2010; |
复杂度分析
- 时间复杂度$O(N * K)$
- 空间复杂度$O(N * K)$
欢迎讨论指正